void main(List<String> args) {}

// a.位置参数

//1.无参数
//1.1无参数类型-这是不带函数参数或者说参数列表为空
String getDefaultErrorMsg() => 'Unknown Error!';
//1.2无参数类型-等价于上面函数形式，同样是参数列表为空
get getDefaultErrorMsg2 => 'Unknown Error!';

//2.必须位置参数
//必需位置参数类型-这里的exception是必需的位置参数
String getErrorMsg(Exception exception) => exception.toString();

//3.可选位置参数
//注意：可选位置参数是花括号括起来标识，后面还要打问号
String getErrorMsg2([String? errorr]) => errorr ?? 'Unknown Error!';

//4.必需位置参数和可选位置参数混合
//注意: 可选位置参数必须在必需位置参数的后面
String getErrorMsg3(Exception exception, [String? extraInfo]) => '${exception.toString()}---$extraInfo';

//b.命名参数
//1.可选命名参数
//注意: 可选命名参数是大括号括起来表示，例如{num a, num b, num c, num d}
num add({num? a, num? b, num? c, num? d}){
   return (a ?? 0) + (b ?? 0) + (c ?? 0) + (d ?? 0);
}

//2.必需位置参数和可选命名参数混合
//注意: 可选命名参数必须在必需位置参数的后面
num add2(num a, num b, {num? c, num? d}){
   return a + b + (c ?? 0) + (d ?? 0);
}

// 注意: 可选位置参数和可选命名参数不能混合在一起使用，因为可选参数列表只能位于整个函数形参列表的最后。